import type { ResponseError, RequestInterceptor } from 'umi-request';
import { notification } from 'antd';
import getToken from '@/services/auth';
import { intl } from '@/utils';
import { getOnlineToken } from '@/services/onlineAuth';


/**
 * 把 请求相关 都放这里，让app.tsx更清爽
 * 异常处理程序
 
 * @see https://beta-pro.ant.design/docs/request-cn
 */

// 拦截 每次请求，获取 token 可能需要判断一个不需要 token的请求 在要在这处理
/**
 * 请求前拦截
 * @param url
 * @param options
 * @returns
 * 如果 请求中包含  auth/ 不需要携带 token  如登录，注册等,目前所有请求都加上token
 */
export const reqInterceptor: RequestInterceptor = (url, options) => {
  const sear = 'cpasApi';
  const isName = url.includes(sear);
  const token: string = isName ? getToken() : getOnlineToken();

  if (token) {
    const headers = {
      cpasToken: token,
    };
    return {
      url,
      options: {
        ...options,
        headers,
      },
    };
  }
  return {
    url,
    options,
  };
};


// // 请求中间件
// export const requestMiddleware: any = async (ctx: Context, next: () => void) => {
//   const { req } = ctx;
//   const { url, options } = req;
//   let { headers } = options;
//   console.log(req);

//   // 基础header
//   // headers = {
//   //   // 接受JSON数据
//   //   'Accept': 'application/json',
//   //   // 发送数据的数据类型
//   //   'Content-Type': 'application/json',
//   //   ...headers,
//   // };
//   const sear = 'cpasApi';
//   const isName = url.includes(sear);
//   const token: string = isName ? getToken() : getOnlineToken();

//   // 是否需要提供token，如果headers中有isGuest，代表无需token头
//   // 获取本地token
//   // const authority: Authority = new Authority();
//   // const jwtToken = token;
//   // const { token_type, access_token, expires_in } = jwtToken;
//   // 本地access token有效时
//   // if (expires_in > 0 && access_token.length > 0) {
//   //   // 附加token
//   //   // headers = {
//   //   //   Authorization: `${token_type} ${access_token}`,
//   //   //   ...headers,
//   //   // };
//   // } else { } else {
//   //   // refresh token 无效时，跳转登录页
//   //   // history.push(loginPath);
//   // }
//   // 本地access token过期时，验证refresh token是否有效
//   // const { refresh_expires_in, refresh_token } = jwtToken;
//   // if (refresh_expires_in > 0 && refresh_token.length > 0) {
//   // refresh token有效，发送请求获取access token
//   if (!token) {
//     const localStorageData: any = localStorage.getItem('cpasUserInfo');
//     const { usercode, aesPassword } = JSON.parse(localStorageData) as any;
//     const tempPassword = decryptByDES(aesPassword);
//     const res = await login({ usercode, password: tempPassword }, {});
//     if (res.ok) {
//       notify({ message: `Token ,已重新获取！`, position: 'top center', width: 600 }, "success", 3000);
//       console.log(res);
//       headers = {
//         cpasToken: getOnlineToken(),
//         ...headers,
//       };
//       ctx.req.options.headers = headers;

//       return await next();
//     }
//   }

//   // const refreshResponse = await requestApi('api/refresh-token', {
//   //   method: 'POST',
//   //   data: { refresh_token },
//   //   headers: { isGuest: "true" },
//   // });
//   // 刷新token的请求是否成功

//   // authority.saveToken(refreshResponse.data);
//   // 附加新获取到的token继续发起原请求
//   // headers = {
//   //   cpasToken: getOnlineToken(),
//   //   ...headers,
//   // };
//   // if (refreshResponse && refreshResponse.data !== undefined) { } else {
//   //   // refresh token未能换取到新的token时跳转登录页
//   //   // history.push(loginPath);
//   // }

//   //  if (headers && !headers.hasOwnProperty('isGuest')) { }
//   // }

//   // 更新头部
//   ctx.req.options.headers = headers;

//   await next();
// };



// export const resInterceptor = (res: Response, opt: RequestOptionsInit) => {
//   return {
//     res,
//     opt,
//   };
// };

/**
 * 异常处理程序
 */
export const errorHandler = async (error: ResponseError) => {
  const { response } = error;
  let errorMessage;
  let errorDescription;
  if (response && response.status) {
    const { status, statusText, url } = response;
    const sear1 = 'http://192.168.1.50:8000/'
    const isUserInfo = url.includes(sear1);
    // const sear = 'cpasApi';
    // const isName = url.includes(sear);
    // console.log(isUserInfo, isName);

    if (status === 401 && isUserInfo) {
      return { data: 'loginSucess', ok: false };
    }
    if (status === 401) {
      errorMessage = intl('app.request.error.authDes', 'Token过期或未登录，请重新登录。');
      notification.error({
        message: errorMessage,
      });
    } else if (status === 504) {

      errorMessage = 'vpn不稳定导致网络异常'
      errorDescription = '状态码：504,请检查网络环境'
      notification.error({
        message: errorMessage,
        description: errorDescription,
      });
    } else {
      const requestErrorMessage = intl('app.request.error', '网络异常');
      errorMessage = `${requestErrorMessage} ${status}: ${url}`;
      errorDescription = statusText;
      // errorDescription = messages[`app.request.${status}`] || statusText;
      notification.error({
        message: errorMessage,
        description: errorDescription,
      });
    }
  }

  if (!response) {
    errorMessage = intl('app.request.error', '网络异常');
    errorMessage = intl('app.request.error.des', '您的网络发生异常，无法连接服务器。');
    notification.error({
      message: errorMessage,
      description: errorDescription,
    });
  }

  throw error;
};
